﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BusinessLayer.Model.Services.Abstract;
using BusinessLayer.Model.Repositories.Abstract;
using BusinessLayer.Model.Repositories.Concrete;
using BusinessLayer.Model.Entities;
using System.Web.UI.WebControls;
using System.IO;

namespace BusinessLayer.Model.Services.Concrete
{
    /// <summary>
    /// Implementacion del Servicio de la galeria de imágenes
    /// </summary>
    public class GalleryService : IGalleryService
    {
        #region Members

        /// <summary>
        /// Repositorio de fotos
        /// </summary>
        private IPictureRepository _pictureRepository = new PictureRepository();
        
        /// <summary>
        /// Servicio de la aplicación
        /// </summary>
        private IApplicationService _applicationService = null;//new ApplicationService();

        #endregion

        #region IGalleryService Members

        /// <summary>
        /// Genera una lista desordenada de html de las fotos de la galeria
        /// </summary>
        /// <returns>Codigo html de la lista de imágenes</returns>
        public string GeneratePictureList(string category)
        {
            var pictureList = _pictureRepository.FetchAll().Where(p => p.Category == category);

            StringBuilder pictureListTag = new StringBuilder();

            foreach (Picture p in pictureList)
            {
                string tag = "<li><span class=\"panel-overlay\">" + p.Description + 
                             "<a target=\"_blank\" href=\"ViewImage.aspx?img=" + p.PictureID +
                             "\"><span style=\"float: right;\">Ver en tamaño original</span></a></span>" +
                             "<img alt=\"" + GetPictureName(p.Path) + "\" " +
                             "src=\"" + _applicationService.GetRelativePath(p.Path) + "\" " +
                             "title=\"" + GetPictureName(p.Path) + "\" /></li>";

                pictureListTag.AppendLine(tag);
            }

            return pictureListTag.ToString();
        }

        /// <summary>
        /// Devuelve el nombre de una foto
        /// </summary>
        /// <param name="path">Ruta del archivo de la foto</param>
        /// <returns>Nombre de la foto</returns>
        public string GetPictureName(string path)
        {
            string[] name = path.Split('\\');

            return name[name.Length - 1].ToString();
        }

        /// <summary>
        /// Salva una foto subida por el usuario en el repositorio y en el disco
        /// </summary>
        /// <param name="path">Ruta donde se grabará el archivo de la foto</param>
        /// <param name="imageFile">Objeto que contiene el archivo subido por el usuario</param>
        /// <param name="description">Descripción de la foto</param>
        /// <param name="category">Categoría de la foto</param>
        /// <returns>Un string que dice si se grabó satisfactoriamente la foto</returns>
        public string SavePicture(string path, FileUpload imageFile, string description, string category)
        {
            string status = "No ha seleccionado ninguna imágen.";
            bool succeeded = false;
            Picture pictureToSave = null;

            if (imageFile.HasFile)
            {
                try
                {
                    if (imageFile.PostedFile.ContentType == "image/jpeg" ||
                        imageFile.PostedFile.ContentType == "image/pjpeg"
                        || imageFile.PostedFile.ContentType == "image/bmp"
                        || imageFile.PostedFile.ContentType == "image/png"
                        || imageFile.PostedFile.ContentType == "image/x-png")
                    {
                        path += "\\" + GenerateImageFileName(path, imageFile.PostedFile.ContentType);
                        imageFile.SaveAs(path);

                        pictureToSave = new Picture(path, description, category);

                        _pictureRepository.Add(pictureToSave);

                        status = "Imágen salvada";
                        succeeded = true;
                    }
                    else
                        throw new Exception("Formato de la imágen inválido. Debe ser (jpg, png o bmp).");
                }
                catch (Exception ex)
                {
                    status = "Error: " + ex.Message;
                }
            }

            if (succeeded)
                _pictureRepository.SubmitChanges();
            else
            {
                if (pictureToSave != null)
                    _pictureRepository.Remove(pictureToSave);
            }
            return status;
        }

        /// <summary>
        /// Devuelve el tag html de la foto especificada en las dimensiones especificadas
        /// </summary>
        /// <param name="width">Ancho de la foto</param>
        /// <param name="height">Alto de la foto</param>
        /// <param name="path">Ruta del archivo de la foto</param>
        /// <returns>Tag html de la foto</returns>
        public string GetImageTag(int width, int height, string path)
        {
            return "<img alt=\"picture\" src=\"" + _applicationService.GetRelativePath(path)
                + "\" height=\"" + height + "\" width=\"" + width + "\" />";
        }

        /// <summary>
        /// Devuelve el tag html de la foto especificada en su tamaño original
        /// </summary>
        /// <param name="path">Ruta del archivo de la foto</param>
        /// <returns>Tag html de la foto</returns>
        public string GetImageTag(string path)
        {
            return "<img alt=\"picture\" src=\"" + _applicationService.GetRelativePath(path) + "\" />";
    
        }

        /// <summary>
        /// Devuelve los tag de los banners (220x48)px
        /// </summary>
        /// <returns>Tag html</returns>
        public string GetBannerTags()
        {
            // Get the (custom) directory specified by the user

            DirectoryInfo dirCustom = new DirectoryInfo(_applicationService.BannerFolder);

            // We'll store the file list here

            FileInfo[] filCustom = dirCustom.GetFiles("*.*");

            StringBuilder sb = new StringBuilder();

            foreach (FileInfo f in filCustom)
                sb.AppendLine("<img src=\"" + Constants.BannersFolderName + "/" + f.Name + "\""
                              +" alt=\"banner\" width=\"220\" height=\"48\" />");


            return sb.ToString();

        }

        #endregion

        #region Impl

        /// <summary>
        /// Genera el nombre de archivo de la foto subida por el usuario
        /// </summary>
        /// <param name="path">Ruta del archivo de la foto</param>
        /// <param name="FileType">Tipo de archivo</param>
        /// <returns>Nombre del archivo generado</returns>
        private string GenerateImageFileName(string path, string FileType)
        {
            string type;

            switch (FileType)
            {
                case "image/jpeg":
                    type = ".jpg";
                    break;
                case "image/pjpeg":
                    type = ".jpg";
                    break;
                case "image/bmp":
                    type = ".bmp";
                    break;
                case "image/png":
                    type = ".png";
                    break;
                case "image/x-png":
                    type = ".png";
                    break;
                default:
                    type = ".jpg";
                    break;
            }

            string filename = Guid.NewGuid().ToString() + type;
            while (System.IO.File.Exists(path + "\\" + filename))
                filename = Guid.NewGuid().ToString() + type;

            return filename;
        }
        #endregion

    }
}
